import javax.print.attribute.standard.JobKOctets;
import java.util.Arrays;

/**
 * 栈:
 *  1. 入栈
 *  2. 出栈
 *  3. 大小，元素个数
 *  4. 栈顶元素
 *  5. 是否为空
 *  6. 查找元素
 */
public class MyStack {
    /**
     * 存储元素的数组
     */
    private Object[] objects;
    /**
     * 存储元素的个数
     */
    private int size ;
    /**
     * 定义一个静态常量（静态初始化常量）
     */
    private static final int DEFAULT_LENGTH = 5;

//    public Object[] getObjects() {
//        return objects;
//    }
//
//    public int getSize() {
//        return size;
//    }

    /**
     * 无参构造
     * 初始化 存放元素的 数组
     */
    public MyStack() {
        objects = new Object[DEFAULT_LENGTH];
    }
    /**
     * 有参构造
     */
    public MyStack(int size){
        if (size < 0 ) {
            throw new IllegalArgumentException("栈的大小不能为负数" + size);
        }
        objects = new Object[size];
    }
    /**
     * 入栈
     */
    public Object push(Object element) {
        //size元素个数
        if ( size == objects.length) {
            //扩容
            grow();
        }
        objects[size] = element;
        size++;
        return element;
    }

    /**
     * 扩容
     */
    public void grow(){
        Object[] newArray = new Object[(objects.length + 10)];
        newArray = Arrays.copyOf(objects,newArray.length);   //size表下标
        objects = newArray;
    }

    /**
     * 出栈，删除栈顶元素
     * @param
     * @return
     */
    public Object pull() {
        Object obj = objects[size-1];
        objects[--size] = null;
        return obj;
    }
    /**
    * 是否为空
    */
    public boolean isEmpty() {
        return size==0;
    }
    /**
     * 检查是否为空
     */
    public void check(){
        if (isEmpty()) {
            throw new RuntimeException("栈中没有元素");
        }

    }

    /**
     * 元素个数
     * @return
     */
    public int size() {
        return this.size;
    }
    /**
     * 返回栈顶元素
     */
    public Object peek() {
        check();
        return objects[size-1];
    }
    /**
     * 查找元素
     */
    public int find (Object obj) {
        for (int i = 0; i < size; i++) {
            if (objects[i] == null) {
                if (objects[i] == obj){
                    return i;
                }
            } else if (objects[i].equals(obj)) {
                return i;
            }
        }
        return -1;
    }

}
